#!/usr/bin/env node

import cac from "cac";
import { IOptions } from "./types";
import { generateIconfont } from "./generateIconfont";
import { restoreSvgs } from "./restoreSvgs";
import { addSvgs } from "./addSvgs";
import { pickSvgs } from "./pickSvgs";
import { removeSvgs } from "./removeSvgs";
import { generateHtml } from "./generateHtml";

const cli = cac();
cli
  .command("")
  .option(
    "--id <id>",
    "父元素id，默认与文件名同名，防止同一个iconfont文件重复创建父元素"
  )
  .option("-c,--clazz", "输出React Class组件，默认是函数组件")
  .option("-d,--deep", "是否递归目录")
  .option("-p,--pure", "是否去掉颜色")
  .option("-r", "是否还原svg")
  .option(
    "--restore <restore>",
    "只恢复指定的svg文件，不修改原iconfont.js文件。指定要恢复的symbols名称，以逗号隔开"
  )
  .option(
    "--add <add>",
    "添加svg到output指定的iconfont文件中，指定要添加的svg所在的目录，如果有重复名称的svg会在在名称中添加数字"
  )
  .option(
    "--remove <add>",
    "指定symbols从iconfont文件中移除，指定要移除的symbols名称，以逗号隔开"
  )
  .option(
    "--pick <add>",
    "指定symbols从iconfont文件中恢复成svg文件并将对应的symbols从文件中删除，指定要移除的symbols名称，以逗号隔开"
  )
  .option("--html", "根据指定的 iconfont.js 生成模版 html")
  .option("-i,--input <input>", "输入路径 默认当前目录")
  .option("-o,--output <output>", "输出路径 默认dist")
  .action(function (options: IOptions) {
    handlerOptions(options);
  });
cli.help();
cli.version("1.1.1");
cli.parse();

function handlerOptions(options: IOptions) {
  const {
    r,
    restore,
    add,
    pick,
    remove,
    i,
    input,
    o,
    output,
    d,
    deep,
    p,
    pure,
    c,
    clazz,
    html,
  } = options;
  Object.assign(options, {
    isPure: p || pure || false,
    isDeep: d || deep || false,
    isClazz: c || clazz || false,
    inputValue: i || input || "",
    outputValue: o || output,
  });
  if (!options.inputValue) {
    throw new Error("there is no input!");
  }
  // 恢复svg
  if (r || restore) restoreSvgs(options);
  // 添加svg
  else if (add) addSvgs(options);
  // 提取svg
  else if (pick) pickSvgs(options);
  // 删除svg
  else if (remove) removeSvgs(options);
  // 生成html模板
  else if (html) generateHtml(options);
  // 生成iconfont
  else generateIconfont(options);
}
